到今天为止进入美人信息大概有 7 个月时间,在项目结构原来一直采用 MVC 的架构来进行搭建。但是随着目前在一起的项目功能模块越来越多,MVC 越来越难以瞒着当前实现灵活拓展功能。所以公司就打算采用 MVVM 架构来对项目进行重构,下面小编就以 MVC 和 MVVM 来进行讲解和对比两者之间的优劣。
MVC 和 MVVM 简述
MVC介绍
记得大概在一年前的时候曾经写过 MVC 的使用和相关一些介绍,这里方便做对比再次对 MVC 进行详解。参考资料 iOS MVC 设计模式
在 GUI 编程领域,MVC 已经拥有差不多 50 年的历史了。早在几十年前,Smalltalk-76 就对 MVC 架构模式进行了实现,在随后的几十年历史中,MVC 产生了很多的变种,例如:HMVC、MVA、MVP、MVVM 和其它将 MVC 运用于其它不同领域的模式。
传统的 MVC

【图片来源于网络】
传统的 MVC 的实现结构图可以看出:Controller 可以直接与 View 和 Model 两者之间进行数据传递,View 可直接从 Model 读取数据进行更新。而且在 Controller 更新 View 模型时是采用直接替换方式,而不是跟新的方式。着移动端这是对界面的没有丝毫的复用,很明显在移动端使我们目前不会采取的。
Apple 的 MVC

【图片来源于网络】
Apple 的 MVC 是采用 Controler、View 和 Model 三者完全解耦进行理想下数据操作模式。Controler 与 View 、Model 直接更新显示视图界面以及对数据模型初始化和更新,然后通过得到数据更新来传递给界面进行显示。View 通过相关的点击或者手势来对控制器进行交互,传递数据或者是相关事件的传递。Model 更新数据或者是更新数据模型通过通知的方式传递给 Controller 控制器。
但是上面在 apple 官方建议中使用
xib或者是storyboard来实现View和Controller两者的完全分离。
开发见到的 MVC

【图片来源于网络】
在实际开发过程中小编所在项目组很多情况是使用代码来初始化 View 模块。这样实际还是上 Controller 和 View 具体关系如上,两者之间有一定的交接和联系。而且Controller 还控制着 View 模块的生命周期,同样也对 Model 是所属关系。而非在传统或者是 Aplle 建议的那样是平行关系。
在前面的文章中有讲述
MVC中Controler、View和Model三者里面具体实现和相关管理内容,详情参考:iOSMVC设计模式
MVP介绍
MVP 是从经典的模式 MVC 演变而来,它们的基本思想有相通的地方:Controller/Presenter 负责逻辑的处理,Model 提供数据,View负责显示。
MVP 与 MVC 有着一个重大的区别:
在
MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过Controller。

【图片来源于网络】
在上面的
MVP流程结构可以看出:在MVP实现中Presenter代替Controller代替实现ViewheModel之间的沟通桥梁。只是MVP中View并不直接使用Model。
MVVM介绍
MVVM 架构模式是微软在 2005 年诞生的,从 Model-View-ViewModel 这个名字来看,它由三个部分组成,也就是 Model、View 和 ViewModel。
在 MVC 的使用过程中小编给大家讲述过 Model 和 View 里面所有的形式,相应的功能。
ViewModel视图模型对象
代替原来 MVC 中的 Controller 视图控制器来和 Model 进行相关的数据交互,在这里把原本在 Controller 里面进行相关计算或者是操作的处理统一放在此类中进行完成。

【图片来源于网络】
在程序实现 MVVM 工程图中可以看出:UIView 和 UIViewController 被看做是一个整体来进行视图展示和生命周期的控制,原来我们需要对数据模型理数据在 Controler 做出相关梳理操作放在 ViewModel 里面进行相关操作。ViewModel 取代 Controler 来实现 View 和 Model 两者之间数据更新或者是数据模型更新工作。
MVC 和 MVVM 代码实现
MVC代码实现
(1) Person 模型对象
1 |
|
(2) Controller 控制器对象
1 |
|
MVVM代码实现
(1) PersonModel 视图模型对象
把上面在 MVC 中 Controller 处理数据放在 PersonModel 进行处理。实现代码如下:
1 | @class Person; |
(2) Controller 控制模型
1 |
|
上面可以看出在使用
MVVM过程中我们可以减少在Controller里面对数据过多处理的造成Controller臃肿的问题。编码过程中由于数据处理从
Controller转换到ViewModel中实现,可以Controller数目更加方便我们对Controller管理。让开发更加方便。